package org.opencms.free.balance;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;

import org.opencms.jsp.CmsJspActionElement;
import org.opencms.main.CmsException;
import org.opencms.main.CmsRuntimeException;
import org.opencms.workplace.CmsDialog;
import org.opencms.workplace.list.A_CmsListDialog;
import org.opencms.workplace.list.CmsListColumnAlignEnum;
import org.opencms.workplace.list.CmsListColumnDefinition;
import org.opencms.workplace.list.CmsListDirectAction;
import org.opencms.workplace.list.CmsListItem;
import org.opencms.workplace.list.CmsListMetadata;
import org.opencms.workplace.list.CmsListOrderEnum;
import org.opencms.workplace.list.CmsListSearchAction;

/**
 * Clase que representa el listado de nodos.
 */
public class BalanceFreeNodeList extends A_CmsListDialog {

    /**
     * Identificador único de la lista.
     */
    private static final String LIST_ID = "nl";

    /**
     * Idenficador de la columna de edición.
     */
    public static final String LIST_COLUMN_EDIT = "ce";

    /**
     * Idenficador de la columna de borrado.
     */
    public static final String LIST_COLUMN_REMOVE = "cr";

    /**
     * Idenficador de la columna de identificadores de nodos.
     */
    public static final String LIST_COLUMN_ID = "id";

    /**
     * Idenficador de la columna de nombre.
     */
    public static final String LIST_COLUMN_NAME = "cn";

    /**
     * Idenficadores de la columna de apellidos.
     */
    public static final String LIST_COLUMN_URL = "cu";

    /**
     * Idenficador de la acción de edición.
     */
    public static final String LIST_ACTION_EDIT = "ae";

    /**
     * Idenficador de la acción de borrado.
     */
    public static final String LIST_ACTION_REMOVE = "ar";

    /**
     * Constructor de la clase.
     */
    public BalanceFreeNodeList(final PageContext context, final HttpServletRequest request, final HttpServletResponse response) {
        super(new CmsJspActionElement(context, request, response), LIST_ID, Messages.get().container(
                Messages.NODE_LIST_DIALOG), LIST_COLUMN_NAME, CmsListOrderEnum.ORDER_ASCENDING, null);
    }

    /**
     * Sobreescribimos el método que se usará para lanzar los mensajes.
     */
    protected void initMessages() {
        addMessages(Messages.get().getBundleName());
        super.initMessages();
    }

    /**
     * Método que se ejecuta para una acción sobre múltiples elementos.
     */
    public void executeListMultiActions() throws IOException, ServletException, CmsRuntimeException {

    }

    /**
     * Método que se ejecuta para una acción individual.
     */
    public void executeListSingleActions() throws IOException, ServletException, CmsRuntimeException {
        String id = getSelectedItem().get(LIST_COLUMN_ID).toString();
        if (getParamListAction().equals(LIST_ACTION_EDIT)) {
            // Se va a llevar a cabo la edicion de un nodo.
            Map params = new HashMap();
            params.put("nodeId", id);
            params.put(CmsDialog.PARAM_ACTION, CmsDialog.DIALOG_INITIAL);
            getToolManager().jspForwardTool(this, "/cluster/nodes/node_edit", params);
        } else if (getParamListAction().equals(LIST_ACTION_REMOVE)) {
            // Se va a llevar a cabo el borrado de un nodo.
            BalanceFreeNode node = new BalanceFreeNode();
            node.setNodeId((new Integer(id)).intValue());
            BalanceFreeNodeDao nodeDao = new BalanceFreeNodeDaoImpl();
            nodeDao.deleteNode(node);
            // Se salvan los cambios
            listSave();
        } else {
            throwListUnsupportedActionException();
        }
    }

    /**
     * Método que rellena los detalles.
     */
    protected void fillDetails(final String detailId) {

    }

    /**
     * Método que obtiene los elementos que conforman la lista.
     */
    protected List getListItems() throws CmsException {
        List listItems = new ArrayList();
        BalanceFreeNodeDao nodeDao = new BalanceFreeNodeDaoImpl();
        // Se obtiene el listado de nodos.
        List<BalanceFreeNode> listNodes = nodeDao.findAllNodes();
        for (BalanceFreeNode node : listNodes) {
        	// Se van insertando los elementos de la lista
            String id = new Integer(node.getNodeId()).toString();
            CmsListItem item = getList().newItem(id);
            item.set(LIST_COLUMN_ID, node.getNodeId());
            item.set(LIST_COLUMN_NAME, node.getNodeName());
            item.set(LIST_COLUMN_URL, node.getNodeUrl());
            listItems.add(item);
        }
        return listItems;
    }

    /**
     * Método que establece las columnas de nuestro listado.
     */
    protected void setColumns(final CmsListMetadata metadata) {
        // Se crea la columna del id principal (no visible).
        CmsListColumnDefinition idColumn = new CmsListColumnDefinition(LIST_COLUMN_ID);
        idColumn.setVisible(false);
        metadata.addColumn(idColumn);

        // Se crea la columna de edición.
        CmsListColumnDefinition editColumn = new CmsListColumnDefinition(LIST_COLUMN_EDIT);
        editColumn.setName(Messages.get().container(Messages.NODE_LIST_EDIT_COLUMN_NAME));
        editColumn.setHelpText(Messages.get().container(Messages.NODE_LIST_EDIT_COLUMN_HELP));
        editColumn.setWidth(Messages.get().container(Messages.NODE_LIST_EDIT_COLUMN_WIDTH).toString());
        editColumn.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER);
        editColumn.setSorteable(false);
        // Se crea la acción a la columna.
        CmsListDirectAction editAction = new CmsListDirectAction(LIST_ACTION_EDIT);
        editAction.setName(Messages.get().container(Messages.NODE_LIST_EDIT_ACTION_NAME));
        editAction.setHelpText(Messages.get().container(Messages.NODE_LIST_EDIT_ACTION_HELP));
        editAction.setIconPath(Messages.get().container(Messages.NODE_LIST_EDIT_ACTION_ICON_PATH).key());
        // Se añade la acción a la columna
        editColumn.addDirectAction(editAction);
        metadata.addColumn(editColumn);

        // Se crea la columna de borrado
        CmsListColumnDefinition removeColumn = new CmsListColumnDefinition(LIST_COLUMN_REMOVE);
        removeColumn.setName(Messages.get().container(Messages.NODE_LIST_REMOVE_COLUMN_NAME));
        removeColumn.setHelpText(Messages.get().container(Messages.NODE_LIST_REMOVE_COLUMN_HELP));
        removeColumn.setWidth(Messages.get().container(Messages.NODE_LIST_REMOVE_COLUMN_WIDTH).toString());
        removeColumn.setAlign(CmsListColumnAlignEnum.ALIGN_CENTER);
        removeColumn.setSorteable(false);
        // Se crea la acción a la columna.
        CmsListDirectAction removeAction = new CmsListDirectAction(LIST_ACTION_REMOVE);
        removeAction.setName(Messages.get().container(Messages.NODE_LIST_REMOVE_ACTION_NAME));
        removeAction.setHelpText(Messages.get().container(Messages.NODE_LIST_REMOVE_ACTION_HELP));
        removeAction.setIconPath(Messages.get().container(Messages.NODE_LIST_REMOVE_ACTION_ICON_PATH).key());
        // Se añade la acción a la columna
        removeColumn.addDirectAction(removeAction);
        metadata.addColumn(removeColumn);

        // Se crea la columna de nombre
        CmsListColumnDefinition nameColumn = new CmsListColumnDefinition(LIST_COLUMN_NAME);
        nameColumn.setName(Messages.get().container(Messages.NODE_LIST_NAME_COLUMN_NAME));
        nameColumn.setHelpText(Messages.get().container(Messages.NODE_LIST_NAME_COLUMN_HELP));
        nameColumn.setWidth(Messages.get().container(Messages.NODE_LIST_NAME_COLUMN_WIDTH).toString());
        nameColumn.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT);
        nameColumn.setSorteable(true);
        metadata.addColumn(nameColumn);

        // Se crea la columna de URL
        CmsListColumnDefinition descriptionColumn = new CmsListColumnDefinition(LIST_COLUMN_URL);
        descriptionColumn.setName(Messages.get().container(Messages.NODE_LIST_URL_COLUMN_NAME));
        descriptionColumn.setHelpText(Messages.get().container(Messages.NODE_LIST_URL_COLUMN_HELP));
        descriptionColumn
                .setWidth(Messages.get().container(Messages.NODE_LIST_URL_COLUMN_WIDTH).toString());
        descriptionColumn.setAlign(CmsListColumnAlignEnum.ALIGN_LEFT);
        descriptionColumn.setSorteable(true);
        descriptionColumn.setTextWrapping(true);
        metadata.addColumn(descriptionColumn);
    }

    protected void setIndependentActions(final CmsListMetadata metadata) {
        // Se podrá buscar en la lista por nombre y URL.
        CmsListSearchAction searchAction = new CmsListSearchAction(metadata.getColumnDefinition(LIST_COLUMN_NAME));
        searchAction.setName(Messages.get().container(Messages.NODE_LIST_SEARCH_NAME));
        searchAction.setHelpText(Messages.get().container(Messages.NODE_LIST_SEARCH_NAME_HELP));
        metadata.setSearchAction(searchAction);
    }

    protected void setMultiActions(final CmsListMetadata arg0) {
    }
}